Day5 資料庫的概念相對的抽象,今天來就來講些具體的內容 - 資料庫的創建 ^^
那我們要怎麼創建資料庫呢?
A model is the single, definitive source of truth about your data. It contains the essential fields and behaviors of the data you’re storing. Django follows the DRY Principle. The goal is to define your data model in one place and automatically derive things from it.
This includes the migrations - unlike in Ruby On Rails, for example, migrations are entirely derived from your models file, and are essentially just a history that Django can roll through to update your database schema to match your current models.
那就是去 Models.py 檔案撰寫,根據自己的需求(想要的資料型態)來決定資料庫的樣貌
此時你就會想: 那我沒有經驗,我要從何撰寫啊?
不用擔心! 這件事情在文件上面也說了
Each model is a Python class that subclasses django.db.models.Model.
因為在前面我們也有講過,大部分的事情Django已經幫你處理好了,我們要完成的事情就是撰寫這背後的邏輯,所以我們根據 Django 所提供的資料型態便能夠完成大多數創建資料庫的事情!
今天我們就來創建一個簡易的餐廳app吧!
但是餐廳有點長,改用攤販 vendor 好了,先來創建一個 vendor app!
(ithome_enve) C:\Users\User\Desktop\ithome\ithome>python manage.py startapp vendor
(ithome_enve) C:\Users\User\Desktop\ithome\ithome>cd vendor
創建完之後進入該資料夾,開始來撰寫 models.py !!
from django.db import models
# Create your models here.
class Vendor(models.Model):
vendor_name = models.CharField(max_length = 20) # 攤販的名稱
store_name = models.CharField(max_length = 10) # 攤販店家的名稱
phone_number = models.CharField(max_length = 20) # 攤販的電話號碼
address = models.CharField(max_length = 100) # 攤販的地址
class Food(models.Model):
food_name = models.CharField(max_length = 30) # 食物名稱
price_name = models.DecimalField(max_digits = 3, decimal_places=0) # 食物價錢
food_vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE) # 代表這食物是由哪一個攤販所做的
每一個class都是繼承django.db.models.Model,還記得吧 ^^! 所以類別名稱後方的()就是塞 models.Model,相信這對你來說不是什麼大問題
接著我們要來定義這個資料庫的型態,設計的架構在上方程式碼註解都說得相當清楚,而 CharField 就是其中一種,把它想成一段字串,你可能就很明瞭了^^,而它後方的 max_length 是必要的參數,記得一定要加上去,顧名思義,它就是限制你最多可以儲存的長度
而在 Food 類別,不一樣的地方是 DecimalField,是儲存十進制的數字,後面參數分別代表 最大長度 及 小數點後方的位數
畢竟台灣目前最小單位就是元,沒有分跟角了,代 0 相信大家比較不陌生!
(佛心店家,最貴1000元還有找
最關鍵的地方在最後一個 ForeignKey,在 Django中是 多對一(many-to-one)的關聯,而前方的參數代表的意思就是對應到哪一個類別,這裡對應到的是 Vendor,而後方的 on_delete 代表的是當對應的類別被刪除之後,這些對應到別人的資料要怎麼被處理,而 CASCADE 就是一倂刪除
所以food_vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
一言以蔽之一個攤販會賣各式各樣的食物,當它今天收店了,你就也再也吃不到它賣的每一樣食物了
就是這麼簡單 ^^
我們寫好了簡易的攤販app的資料庫,那我們要怎麼傳達給 Django,讓他知道我們這裡有一個 model 寫好等你來追蹤哩?
其實在 Day5 有先提到,要追蹤該app,就要將它寫入 installed_apps裡面
因此,在settings.py裡面,我們要將內容加上 vendor.apps.VendorConfig
INSTALLED_APPS = [
'vendor.apps.VendorConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
這樣就能確保 Django 有開始在追蹤 vendor app 囉!
因為我們在 models.py 做了更動,我們要告訴 Django 我們修改了一些內容,所以我們要輸入 :(ithome_enve) C:\Users\User\Desktop\ithome\ithome>python manage.py makemigrations vendor
之後你便會看到,Django幫你搬家之後給你簡易版的回饋 ^^
(ithome_enve) C:\Users\User\Desktop\ithome\ithome>python manage.py makemigrations vendor
Migrations for 'vendor':
vendor\migrations\0001_initial.py
- Create model Food
- Create model Vendor
- Add field food_vendor to food
更詳細的內容則是可以到 vendor app裡面的 migrations 查看,因為這是我們第一次做變動,所以名稱也取得很明瞭0001_initial.py
# Generated by Django 2.1.2 on 2018-10-06 15:25
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Food',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('food_name', models.CharField(max_length=30)),
('price_name', models.DecimalField(decimal_places=0, max_digits=3)),
],
),
migrations.CreateModel(
name='Vendor',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('vendor_name', models.CharField(max_length=20)),
('store_name', models.CharField(max_length=10)),
('phone_number', models.CharField(max_length=20)),
('address', models.CharField(max_length=100)),
],
),
migrations.AddField(
model_name='food',
name='food_vendor',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vendor.Vendor'),
),
]
但實際上,我們其實只是將變動的資訊儲存起來而已,你要實際上讓它更動,則要下python manage.py migrate vendor 0001
0001 代表的是 遷移的代號(migration_name)
Operations to perform:
Apply all migrations: vendor
Running migrations:
Applying vendor.0001_initial... OK
這樣實際上!! 我們就建好了 vendor 資料庫囉 ^^
蛤? 你問我要去哪看,這又是另外一篇文章的事情了呢,哈哈
今天就先講到這裡吧^^
沒有什麼事情是絕對的,透過不同角度去看待一件事情,你會發現更多 From BY
好奇, 在創建vendor app時,其settings.py怎麼不自動生成以下
INSTALLED_APPS = [
'vendor.apps.VendorConfig',